package com.artisan.config;

import com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeChatProperties;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AiConfig {

        /**
     * 任务规划聊天客户端配置
     *
     * 该函数用于构建一个专门用于任务规划的聊天客户端，配置了特定的系统提示词、
     * 聊天内存顾问和模型参数，用于识别和拆分用户的票务相关任务。
     *
     * @param chatModel 通义千问聊天模型实例，用于实际的对话处理
     * @param options DashScope聊天配置属性，包含模型的基础配置选项
     * @param chatMemory 聊天内存管理器，用于维护对话历史状态
     * @return 配置完成的任务规划聊天客户端实例
     */
    // 任务规划
    @Bean
    public ChatClient planningChatClient(DashScopeChatModel chatModel,
                                         DashScopeChatProperties options,
                                         ChatMemory chatMemory) {
        DashScopeChatOptions dashScopeChatOptions = DashScopeChatOptions.fromOptions(options.getOptions());
        // 设置温度参数为0.4，平衡创造性和确定性
        dashScopeChatOptions.setTemperature(0.4);

        // 构建聊天客户端，配置系统提示词、内存顾问和模型选项
        return  ChatClient.builder(chatModel)
                .defaultSystem("""
                        # 票务助手任务拆分规则
                        ## 1.要求
                        ### 1.1 根据用户内容识别任务
                        
                        ## 2. 任务
                        ### 2.1 JobType:退票(CANCEL) 要求用户提供姓名和预定号， 或者从对话中提取；
                        ### 2.2 JobType:查票(QUERY) 要求用户提供预定号， 或者从对话中提取；
                        ### 2.3 JobType:其他(OTHER)
                        """)
                .defaultAdvisors(
                        MessageChatMemoryAdvisor.builder(chatMemory).build()
                )
                .defaultOptions(dashScopeChatOptions)
                .build();
    }


    /**
     * 创建智能客服聊天客户端Bean
     *
     * @param chatModel 聊天模型实例，用于处理对话请求
     * @param options DashScope聊天配置属性，包含模型配置选项
     * @param chatMemory 聊天记忆存储，用于保存对话历史
     * @return 配置好的ChatClient实例，用于智能客服对话
     */
    // 智能客服
    @Bean
    public ChatClient botChatClient(DashScopeChatModel chatModel,
                                    DashScopeChatProperties options,
                                         ChatMemory chatMemory) {

        // 配置DashScope聊天选项，设置温度参数以控制回复的随机性
        DashScopeChatOptions dashScopeChatOptions = DashScopeChatOptions.fromOptions(options.getOptions());
        dashScopeChatOptions.setTemperature(1.2);

        // 构建并返回聊天客户端，设置默认系统提示词、记忆顾问和配置选项
        return  ChatClient.builder(chatModel)
                .defaultSystem("""
                           你是Artisan航空智能客服代理， 请以友好的语气服务用户。
                            """)
                .defaultAdvisors(
                        MessageChatMemoryAdvisor.builder(chatMemory).build()
                )
                .defaultOptions(dashScopeChatOptions)
                .build();
    }


}